#pragma once
#include "BondInfo.h"
#include "qbprotocol/include/SSFilters.h"
////////////////////////////////////////////
// 增续发券
class S_BONDLIB_EXPORT CABSBondInfo {
 public:
  CABSBondInfo();
  CABSBondInfo(const CABSBondInfo& one);
  ~CABSBondInfo();

  enum Market {
    MARKET_ALL = 0,
    MARKET_CIB,
    MARKET_CIB_ABN,
    MARKET_SSE,
    MARKET_SZE,
    MARKET_NUMBER
  };

  enum BaseType {
    BASETYPE_NONE = -1,
    BASETYPE_ALL = 0,

    BASETYPE_CARAUTO,             // 汽车贷款
    BASETYPE_CONSUMER,            // 消费贷款
    BASETYPE_MICRO,               // 小微/小额
    BASETYPE_CARLEASE,            // 汽车融资租赁
    BASETYPE_OTHERLEASE,          // 其他融资租赁
    BASETYPE_PROPERTYSUM,         // 地产供应链
    BASETYPE_OTHERSUM,            // 其他供应链
    BASETYPE_ACCOUNTSRECEIVABLE,  // 应收账款
    BASETYPE_TRADEFIN,            // 保理融资
    BASETYPE_CMBS,                // CMBS
    BASETYPE_REITS,               // 类REITS
    BASETYPE_NPL,                 // NPL
    BASETYPE_SPECIFICNONGOLD,     // 特定非金
    BASETYPE_RMBS,                // RMBS
    BASETYPE_ABSABN,              // 并表ABS/ABN
    BASETYPE_BALANCE,             // 购房尾款
    BASETYPE_ACCOUNTS,            // 基础设施
    BASETYPE_OTHER,               // 其他
    BASETYPE_NUM
  };

  enum TrancheClass {
    TRANCHE_NONE = -1,
    TRANCHE_ALL = 0,
    TRANCHE_FISRT,
    TRANCHE_SECOND,
    TRANCHE_SUB,
    TRANCHE_NUM
  };

  enum Coupon {
    COUPON_ALL = 0,    // 全部
    COUPON_FIXED,      // 固息
    COUPON_DEPO_1Y,    // DEPO_1Y
    COUPON_LRB_1Y,     // LRB_1Y
    COUPON_LRB_5Y,     // LRB_5Y
    COUPON_LRB_1Y_3Y,  // LRB_1Y_3Y
    COUPON_LRB_1Y_5Y,  // LRB_1Y_5Y
    COUPON_LPR_1Y,     // LPR_1Y
    COUPON_LPR_5Y,     // LPR_5Y
    COUPON_OTHER,      // 其他
    COUPON_NUM
  };

 public:
  static const char* GetBaseTypeString(int nType);
  void Clear();  // 初始化数据

  void SetBondKey(const char* sBondKey);        // m_sBondKey;
  void SetABSID(const char* sABSID);            // m_sAbsId;			//abs_id
  void SetSeriesName(const char* sSeriesName);  // m_sSeriesName;	//系列
  void SetIssuerCode(const char* sIssuerCode);  // m_sIssuerCode;	//发行人
  void SetABSType(const char* sType1, const char* sType2,
                  const char* sType3);  // m_sAbsType1, m_sAbsType2, m_sAbsType3
  void SetAcutulFinancier(
      const char* sAcutulFinancier);  // m_sActualFinancier;	实际融资人
  void SetCreditSubject(
      const char* sCreditSubject);  // m_sCreditSubject;	//信用主体
  void SetTrancheClass(
      const char* sTrancheClass);  // m_nTrancheClass;	//产品结构

  const char* GetBondKey();               // m_sBondKey;
  const char* GetABSID() const;           // m_sAbsId;		//abs_id
  const char* GetBaseTypeString() const;  // m_sBaseType;
                                          // //基础资产
  const char* GetSeriesName() const;  // m_sSeriesName;	//系列
  const char* GetIssuerCode() const;  // m_sIssuerCode;	//发行人
  const char* GetABSType1() const;    // m_sAbsType1, m_sAbsType2, m_sAbsType3
  const char* GetABSType2() const;
  const char* GetABSType3() const;
  const char* GetAcutulFinancier() const;  // m_sActualFinancier;
                                           // 实际融资人
  const char* GetCreditSubject() const;  // m_sCreditSubject;	//信用主体
  int GetTrancheClass() const;           // m_nTrancheClass;	//产品结构

  //////////////////////////////////////////////////////////////////////
  bool CheckABSMarket(int nMarket) const;
  bool CheckBaseType(const BLHCONDITION& Cond) const;
  bool CheckTrancheClass(const BLHCONDITION& Cond) const;
  bool CheckSeries(const BLHCONDITION& Cond) const;
  bool CheckIssuer(const BLHCONDITION& condStr) const;
  bool CheckAcutulFinancier(const BLHCONDITION& condStr) const;

 private:
  char m_sBondKey[33];
  char m_sABSID[33];       // abs_id
  char m_sSeriesName[33];  // 系列
  char m_sIssuerCode[33];  // 发行人
  char m_sType1[33];
  char m_sType2[33];
  char m_sType3[33];
  char m_sActualFinancier[64];   // 实际融资人
  char m_sCreditSubject[64];     // 信用主体
  BaseType m_nBaseType;          // 基础资产
  TrancheClass m_nTrancheClass;  // 产品结构
};
